/**
 * **************************************************************************
 *
 * @说明: 
 * @项目名称: talent-proxy-mysql-common
 *
 * @author: tanyaowu 
 * @创建时间: 2017年1月25日 下午9:35:56
 *
 * **************************************************************************
 */
package com.talent.proxy.mysql.common.utils;

import java.nio.ByteBuffer;

import com.talent.aio.common.ChannelContext;
import com.talent.aio.common.exception.AioDecodeException;
import com.talent.proxy.mysql.common.MysqlExt;
import com.talent.proxy.mysql.common.MysqlPacket;
import com.talent.proxy.mysql.common.MysqlReturn;
import com.talent.proxy.mysql.common.packets.s2c.EOFPacket;
import com.talent.proxy.mysql.common.packets.s2c.ErrorPacket;
import com.talent.proxy.mysql.common.packets.s2c.OKPacket;

/**
 * 
 * @author tanyaowu 
 * @创建时间 2017年1月25日 下午9:35:56
 *
 * @操作列表
 *  编号	| 操作时间	| 操作人员	 | 操作说明
 *  (1) | 2017年1月25日 | tanyaowu | 新建类
 *
 */
public class DecodeUtils
{

	/**
	 * 
	 *
	 * @author: tanyaowu
	 * @创建时间:　2017年1月25日 下午9:35:56
	 * 
	 */
	public DecodeUtils()
	{

	}

	/**
	 * 分派解码
	 * @param buffer
	 * @param channelContext
	 * @return
	 *
	 * @author: tanyaowu
	 * @创建时间:　2017年1月25日 下午7:59:19
	 *
	 */
	public static MysqlPacket dispatchDecode(ByteBuffer buffer, ChannelContext<MysqlExt, MysqlPacket, MysqlReturn> channelContext, boolean throwExceptionWhenNotMatching)
			throws AioDecodeException
	{
		int readableLength = buffer.limit() - buffer.position();
		if (readableLength < 4)
		{
			return null;
		}
		byte mark = buffer.get(buffer.position() + 4);
		switch (mark)
		{
		case OKPacket.MARK:
		{
			OKPacket packet = new OKPacket();
			packet = (OKPacket) packet.decode(buffer, channelContext);
			return packet;
		}
		case ErrorPacket.MARK:
		{
			ErrorPacket packet = new ErrorPacket();
			packet = (ErrorPacket) packet.decode(buffer, channelContext);
			return packet;
		}
		case EOFPacket.MARK:
		{
			EOFPacket packet = new EOFPacket();
			packet = (EOFPacket) packet.decode(buffer, channelContext);
			return packet;
		}
		default:
		{
			if (throwExceptionWhenNotMatching)
			{
				throw new AioDecodeException("it is not a OKPacket、ErrorPacket or EOFPacket, fieldCount is " + mark);
			} else
			{
				return null;
			}

		}
		}
	}

	/**
	 * @param args
	 *
	 * @author: tanyaowu
	 * @创建时间:　2017年1月25日 下午9:35:56
	 * 
	 */
	public static void main(String[] args)
	{
		// TODO Auto-generated method stub

	}

}
